package dk.kmd.statemachine.eugenia.validation.actions;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.jface.dialogs.MessageDialog;

import statemachine.Statemachine;

/**
 * Our sample action implements workbench action delegate. The action proxy will
 * be created by the workbench and shown in the UI. When the user tries to use
 * the action, this delegate will be created and execution will be delegated to
 * it.
 * 
 * @see IWorkbenchWindowActionDelegate
 */
public class ValidateModelAction implements IWorkbenchWindowActionDelegate {
	private IWorkbenchWindow window;

	/**
	 * The constructor.
	 */
	public ValidateModelAction() {
	}

	/**
	 * The action has been activated. The argument of the method represents the
	 * 'real' action sitting in the workbench UI.
	 * 
	 * @see IWorkbenchWindowActionDelegate#run
	 */
	public void run(IAction action) {
		IWorkbenchPage activePage = window.getActivePage();
		IEditorPart activeEditor = activePage.getActiveEditor();

		if (activeEditor instanceof DiagramDocumentEditor) {
			DiagramDocumentEditor dde = (DiagramDocumentEditor) activeEditor;
			EObject resolveSemanticElement = dde.getDiagramEditPart()
					.resolveSemanticElement();

			// We got our statemachine in Java code
			// Note that this is what is drawed not right now
			// (which might be different from what is saved)!
			if (resolveSemanticElement instanceof Statemachine) {
				Statemachine st = (Statemachine) resolveSemanticElement;
				System.err.println(st);

				if (resolveSemanticElement != null) {
					MessageDialog.openInformation(window.getShell(),
							"Validation result",
							"Here we should show the validation result of validating "
									+ resolveSemanticElement.getClass()
											.getInterfaces()[0].getName());
					return;
				}
			}
		}

		MessageDialog.openInformation(window.getShell(), "Validation result",
				"Sorry but the file does not seem to be a digram of type Statemachine");
	}

	/**
	 * Selection in the workbench has been changed. We can change the state of
	 * the 'real' action here if we want, but this can only happen after the
	 * delegate has been created.
	 * 
	 * @see IWorkbenchWindowActionDelegate#selectionChanged
	 */
	public void selectionChanged(IAction action, ISelection selection) {
	}

	/**
	 * We can use this method to dispose of any system resources we previously
	 * allocated.
	 * 
	 * @see IWorkbenchWindowActionDelegate#dispose
	 */
	public void dispose() {
	}

	/**
	 * We will cache window object in order to be able to provide parent shell
	 * for the message dialog.
	 * 
	 * @see IWorkbenchWindowActionDelegate#init
	 */
	public void init(IWorkbenchWindow window) {
		this.window = window;
	}
}